//
//  FMDBManager.swift
//  1-FMDB框架的进一步封装
//
//  Created by yellow on 15/10/30.
//  Copyright © 2015年 yellow. All rights reserved.
//

import UIKit

/// 针对FMDB操作SQLite的一些列操作的进一步封装
class FMDBManager{

    static let shareManger = FMDBManager()
    
    /// 全局数据库操作队列
    let queue:FMDatabaseQueue
    
    
    /// 执行 SQL 返回字典数组
    ///
    /// - parameter sql: SQL
    ///
    /// - returns: 字典数组
    func execRecordSet(sql: String) -> [[String: AnyObject]] {
        
        // 定义结果[字典数组]
        var result = [[String: AnyObject]]()
        
        // `同步`执行数据库查询 - FMDB 默认情况下，都是在主线程上执行的
        FMDBManager.shareManger.queue.inDatabase { (db) -> Void in
            
            print(NSThread.currentThread())
            
            guard let rs = db.executeQuery(sql) else {
                print("没有结果")
                
                return
            }
            
            while rs.next() {
                // 1. 列数
                let colCount = rs.columnCount()
                
                // 创建字典
                var dict = [String: AnyObject]()
                
                // 2. 遍历每一列
                for col in 0..<colCount {
                    // 1> 列名
                    let name = rs.columnNameForIndex(col)
                    // 2> 值
                    let obj = rs.objectForColumnIndex(col)
                    
                    // 3> 设置字典
                    dict[name] = obj
                }
                // 将字典插入数组
                result.append(dict)
            }
        }
        
        // 返回结果
        return result
    }

    
    
    private init() {
        //1.获取沙盒路径
        var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
        path = (path as NSString).stringByAppendingPathComponent("weibo.db")
        
        // 1. 打开数据库队列
        // 如果数据库不存在，会建立数据库，然后，再创建队列并且打开数据库
        // 如果数据库存在，会直接创建队列并且打开数据库
        queue = FMDatabaseQueue(path: path)
        guardTable()
    }
    
/// 维护数据表，没有将创建，反之就return
    private func guardTable(){
        let path = NSBundle.mainBundle().pathForResource("weibo.sql", ofType: nil)!
        let sql = try! String(contentsOfFile: path)
        
        queue.inDatabase { (db) -> Void in
            if db.executeStatements(sql){
                print("创建数据表成功！")
            }
        }
    }
}
